package com.marinesky.mstools.date;
/*
                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
         佛祖保佑       永无BUG
*/
//          佛曰:
//                  写字楼里写字间，写字间里程序员；
//                  程序人员写程序，又拿程序换酒钱。
//                  酒醒只在网上坐，酒醉还来网下眠；
//                  酒醉酒醒日复日，网上网下年复年。
//                  但愿老死电脑间，不愿鞠躬老板前；
//                  奔驰宝马贵者趣，公交自行程序员。
//                  别人笑我忒疯癫，我笑自己命太贱；
//                  不见满街漂亮妹，哪个归得程序员？

import org.apache.commons.lang.StringUtils;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import java.util.IllegalFormatException;

/**
 * ================================================
 * 时间工具类
 * ❶.格式化日期
 * ❷.解析日期
 * ❸.毫秒与日期互转
 * ❹.日期加时间量
 * ❺.
 * ❻.
 * ================================================
 */
public class DateUtil {

    protected static final long millisPerHour=1000l*60*60;

    protected  static final long millisPerMinute=1000l*60;

    protected static final long millisPerSecond=1000l;


    /**
     * 毫秒转成几时几分几秒毫秒
     * @param millis
     * @return  -- 00:02:01.120
     */
    public static String millisToSimple(long millis){
        StringBuffer result=new StringBuffer();
        int hour= (int) (millis/millisPerHour);
        int min= (int) ((millis-hour*millisPerHour)/millisPerMinute);
        int second=(int) ((millis-hour*millisPerHour-min*millisPerMinute)/millisPerSecond);
        int milli=(int) (millis-hour*millisPerHour-min*millisPerMinute-second*millisPerSecond);

        result.append(hour<10 ? ("0"+hour) :(""+hour));
        result.append(":");
        result.append(min<10 ? ("0"+min) :(""+min));
        result.append(":");
        result.append(second<10 ? ("0"+second) :(""+second));
        if(milli!=0){
            result.append(".").append(milli);
        }
        return result.toString();
    }

    /**
     * 几时几分几秒几毫秒转毫秒
     * @param simple
     * @return
     */
    public static long simpleToMillis(String simple){

        long result=0l;
        if(simple.indexOf(".")>0){
            int milliIndex=simple.indexOf(".");
            result=Long.parseLong(simple.substring(milliIndex+1,simple.length()));
            simple=simple.substring(0,milliIndex);
        }
        String[] times=simple.split(":");
        if(times.length!=3){
            throw new IllegalArgumentException("the simple is not right format!");
        }
        result=result+Long.parseLong(times[0])*millisPerHour+Long.parseLong(times[1])*millisPerMinute+Long.parseLong(times[2])*millisPerSecond;
        return result;
    }


    /**
     * 格式化日期
     * @param date  --日期
     * @param dateFormat --日期格式(如果格式为null,则默认格式yyyy-MM-dd HH:mm:ss)
     * @return
     */
    public static String formatDate(Date date,DateFormat dateFormat){
        if(date==null){
            return null;
        }
        if(dateFormat==null){
            dateFormat=DateFormat.Date_Time_Format;
        }
        return dateFormat.getFormat().format(date);
    }

    /**
     * 把日期字符转日期
     * @param dateStr  --日期字符串
     * @param dateFormat  --格式
     * @return
     */
    public static Date parseDate(String dateStr,DateFormat dateFormat){
        Date date=null;
        if(StringUtils.isBlank(dateStr)){
            return date;
        }
        try {
            date=dateFormat.getFormat().parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return  date;
    }

    /**
     * 把毫秒转成日期
     * @param millis  --毫秒
     * @return
     */
    public static Date millisToDate(long millis){
        Date date = new Date(millis);
        return date;
    }

    /**
     * 将日期转毫秒
     * @param date  --日期
     * @return
     */
    public static long dateToMillis(Date date){
       return date.getTime();
    }

    /**
     *
     * @param date  --日期
     * @param type  --类型Calendar常量,年月日等
     * @param range --添加或减少的量
     * @return
     */
    public static Date plusMinusDate(Date date,int type,int range){
        Calendar calendar=Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(type,range);
        return  calendar.getTime();
    }





}
